﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TheVoiceOfSnake
{
    class Segmentator
    {
        private int F = 11025;      // częstotliwość próbkowania; ilość próbek/s
        private int N;              //długość ramki
        private int M;              // przesunięcie

        public int Frequency
        {
            get { return F; }
        }
        public IEnumerable<Frame> SegmentInputValues(byte[] input)
        {
            ComputeFrameParameters();
            return FramesEvaluation(input);
        }

        public void ComputeFrameParameters()
        {
            // dobranie rozmiaru ramki i przesunięcia w zależności od częstotliwości
            double samplePerMS = F / 1000;
            int factor = 0;
            if (samplePerMS <= 6.67)
            {
                // N = 45ms, N= 15ms
                factor = 45;
            }
            else // if (samplePerMS > 6.67 && samplePerMS <= 8)
            {
                // N = 30ms, N= 15ms
                factor = 30;
            }
            N = factor * (int)samplePerMS;
            M = N / 3;
        }

        public IEnumerable<Frame> FramesEvaluation(byte[] input)
        {
            List<Frame> frames = new List<Frame>();
            Frame frame = new Frame();
            int size = input.Length;

            for (int i = 0; i < size; i += M)
            {
                if (i + N > size)
                {
                    frames.Add(new Frame(PrepareTableForFrame(input, i, size)));
                }
                else
                {
                    frames.Add(new Frame(PrepareTableForFrame(input, i, i + N)));
                }
            }
            return frames;
        }

        private byte[] PrepareTableForFrame(byte[] table, int start, int end)
        {
            byte[] result = new byte[N];
            for (int i = start, j = 0; i < end; i++, j++)
            {
                result[j] = table[i];
            }
            return result;
        }
    }
}
